// 版权所有2009 Go作者。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package syscall

// archonsorsr2捕获了r2被
// runtime.GOARCH所尊重的事实。系统调用约定通常是r1、r2、err:=
// 系统调用（陷阱，…）。并非所有架构都在
// ABI中定义r2。参见“人工系统调用”。
const archHonorsR2 = true

const _SYS_setgroups = SYS_SETGROUPS

// sys Dup2（oldfd int，newfd int）（错误）
// sysnb EpollCreate（size int）（fd int，error error）
// sys Fchown（fd int，uid int，gid int）（错误）
// sys Fstat（fd int，stat*stat_t）（错误）
// sys Fstatfs（fd int，buf*stat t）（error）
// sys Ftruncate（fd int，length int64）（错误）
// sysnb Getegid（）（egid int）
// sysnb Geteuid（）（euid int）
// sysnb Getgid（）（gid int）
// sysnb Getrlimit（resource int，rlim*Rlimit）（错误）
// sysnb Getuid（）（uid int）
// sysnb InotifyInit（）（fd int，error error）
// sys Ioperm（from int，num int，on int）（error error）
// sys Iopl（level int）（error error）
// sys Listen（s int，n int）（error error）
// sys Pause（）（error）
// sys Pread（fd int，p[]字节，偏移量int64）（n int，error error）=SYS_PREAD64 
// SYS Pwrite（fd int，p[]字节，偏移量int64）（n int，error error error）=SYS_PWRITE64 
// SYS Renameat（olddirfd int，oldpath string，newdirfd int，newpath string）（error）
// SYS Seek（fd int，偏移量int64，whence int）（off int64，error）=SYS_LSEEK 
// SYS Select（nfd int，r*FdSet，w*FdSet，e*FdSet，timeout*Timeval）（n int，error error）
// SYS sendfile（outd int，infd int，offset*int64，count int）（writed int，error error）
// SYS Setfsuid（uid int）（error error）
// sysnb Setrlimit（resource int，rlim*Rlimit）（error error）
// sys Shutdown（fd int，how int）（error error）
// /sys Splice（rfd int，roff*int64，wfd int，woff*int64，len int，flags int）（n int64，error error）
// sys-SyncFileRange（fd-int，off-int64，n-int64，flags-int）（错误）
// sys-Truncate（路径字符串，长度int64）（错误）
// sys-Ustat（dev-int，ubuf*Ustat）（错误）
// sys accept（s-int，rsa*RawSockaddrAny，addrlen*\u-Socklen）（fd-int，error）
// sys bind（s int，addr unsafe.Pointer，addrlen _Socklen）（error）
// sys connect（s int，addr unsafe.Pointer，addrlen _Socklen）（error）
// sys fstatat（fd int，path string，stat*stat，stat，stat，flags int）（error）=SYS_NEWFSTATAT 
// sysnb getgroups（n int，list*.\u Gid_t）（nn int，error error）
// SYS getsockopt（s int，level int，name int，val unsafe.Pointer，vallen*.\u Socklen）（error error error）
// sysnb socketpair（域int，类型int，proto int，fd*[2]int32）（error error）
// sysnb getpeername（fd int，rsa*RawSockaddrAny，addrlen*(error）
// sys recvfrom（fd int，p[]byte，flags int，from*RawSockaddrAny，fromlen*(n int，error error）
// sys sendto（s int，buf[]byte，flags int，to safe.Pointer，addrlen(Socklen)）（error error）
// sys recvmsg（s int，Msghdr，flags int）（n int，error error error）

func Stat(path string, stat *Stat_t) (err error) {
	return fstatat(_AT_FDCWD, path, stat, 0)
}

func Lchown(path string, uid int, gid int) (err error) {
	return Fchownat(_AT_FDCWD, path, uid, gid, _AT_SYMLINK_NOFOLLOW)
}

func Lstat(path string, stat *Stat_t) (err error) {
	return fstatat(_AT_FDCWD, path, stat, _AT_SYMLINK_NOFOLLOW)
}


// go:noescape 
func gettimeofday(tv *Timeval) (err Errno)

func Gettimeofday(tv *Timeval) (err error) {
	errno := gettimeofday(tv)
	if errno != 0 {
		return errno
	}
	return nil
}

func Time(t *Time_t) (tt Time_t, err error) {
	var tv Timeval
	errno := gettimeofday(&tv)
	if errno != 0 {
		return 0, errno
	}
	if t != nil {
		*t = Time_t(tv.Sec)
	}
	return Time_t(tv.Sec), nil
}

// sys Utime（路径字符串，buf*Utimbuf）（error error）
// sys utimes（路径字符串，times*[2]Timeval）（error）

func setTimespec(sec, nsec int64) Timespec {
	return Timespec{Sec: sec, Nsec: nsec}
}

func setTimeval(sec, usec int64) Timeval {
	return Timeval{Sec: sec, Usec: usec}
}


func Pipe(p []int) (err error) {
	if len(p) != 2 {
		return EINVAL
	}
	var pp [2]_C_int
	err = pipe(&pp)
	p[0] = int(pp[0])
	p[1] = int(pp[1])
	return
}


func Pipe2(p []int, flags int) (err error) {
	if len(p) != 2 {
		return EINVAL
	}
	var pp [2]_C_int
	err = pipe2(&pp, flags)
	p[0] = int(pp[0])
	p[1] = int(pp[1])
	return
}

func (r *PtraceRegs) PC() uint64 { return r.Rip }

func (r *PtraceRegs) SetPC(pc uint64) { r.Rip = pc }

func (iov *Iovec) SetLen(length int) {
	iov.Len = uint64(length)
}

func (msghdr *Msghdr) SetControllen(length int) {
	msghdr.Controllen = uint64(length)
}

func (cmsg *Cmsghdr) SetLen(length int) {
	cmsg.Len = uint64(length)
}

func rawVforkSyscall(trap, a1 uintptr) (r1 uintptr, err Errno)
